คู่มือฉบับสมบูรณ์สำหรับการนำกระบวนการ Deploy CSS มาใช้ โดยเน้นที่ประสิทธิภาพ ความสม่ำเสมอ และแนวปฏิบัติที่ดีที่สุดสำหรับทีมพัฒนาเว็บทั่วโลก
กฎการใช้งาน CSS: การนำกระบวนการ Deploy ที่แข็งแกร่งมาใช้
ในโลกของการพัฒนาเว็บที่เปลี่ยนแปลงอย่างรวดเร็ว กระบวนการ Deploy Cascading Style Sheets (CSS) ที่มีประสิทธิภาพและออกแบบมาอย่างดีเป็นสิ่งสำคัญยิ่ง มันช่วยให้มั่นใจได้ว่าสไตล์ของคุณจะถูกส่งไปยังผู้ใช้ทั่วโลกอย่างสม่ำเสมอ รักษาความสมบูรณ์ของแบรนด์และประสบการณ์ผู้ใช้ที่ราบรื่น คู่มือนี้จะเจาะลึกหลักการพื้นฐานและขั้นตอนปฏิบัติในการนำกระบวนการ Deploy CSS ที่แข็งแกร่งมาใช้ โดยรองรับผู้ชมทั่วโลกที่มีสภาพแวดล้อมการพัฒนาและขนาดโครงการที่หลากหลาย
ทำความเข้าใจความสำคัญของการ Deploy CSS ที่มีโครงสร้าง
แนวทางที่ยุ่งเหยิงในการ Deploy CSS อาจนำไปสู่ปัญหาที่ซับซ้อน รวมถึงสไตล์ที่ไม่สอดคล้องกันในเบราว์เซอร์และอุปกรณ์ต่างๆ, เลย์เอาต์ที่ผิดเพี้ยน, และเวลาในการโหลดที่นาน ปัญหาเหล่านี้จะทวีความรุนแรงขึ้นสำหรับทีมสากล เนื่องจากสภาพเครือข่าย, ความสามารถของอุปกรณ์, และความชอบของภูมิภาคที่แตกต่างกัน กระบวนการ Deploy ที่มีโครงสร้างช่วยลดความเสี่ยงเหล่านี้โดย:
- สร้างความสม่ำเสมอ: รับประกันว่า CSS เดียวกันที่ผ่านการทดสอบแล้วจะถูกส่งไปยังผู้ใช้ทุกคน โดยไม่คำนึงถึงสถานที่หรือสภาพแวดล้อมการท่องเว็บ
- เพิ่มประสิทธิภาพ: ทำให้งานที่ซ้ำซากเป็นไปโดยอัตโนมัติ ทำให้ทีมนักพัฒนาสามารถมุ่งเน้นไปที่สไตล์และฟังก์ชันหลักได้
- ปรับปรุงความน่าเชื่อถือ: ลดข้อผิดพลาดจากมนุษย์ผ่านการตรวจสอบอัตโนมัติและกลยุทธ์การ Rollback ที่กำหนดไว้
- อำนวยความสะดวกในการทำงานร่วมกัน: จัดให้มี Workflow ที่ชัดเจนและสามารถทำซ้ำได้สำหรับทีม โดยเฉพาะอย่างยิ่งทีมที่กระจายตัวอยู่ในเขตเวลาที่แตกต่างกัน
- ปรับปรุงประสิทธิภาพ: รวมขั้นตอนสำหรับการย่อขนาด (minification), การรวม (concatenation), และการดึง CSS ที่สำคัญ (critical CSS extraction) ซึ่งนำไปสู่การโหลดหน้าเว็บที่เร็วขึ้น
ขั้นตอนสำคัญของกระบวนการ Deploy CSS
กระบวนการ Deploy CSS ที่ครอบคลุมโดยทั่วไปประกอบด้วยหลายขั้นตอนสำคัญ แม้ว่าเครื่องมือและวิธีการเฉพาะอาจแตกต่างกันไป แต่หลักการพื้นฐานยังคงสม่ำเสมอ:
1. การพัฒนาและการควบคุมเวอร์ชัน
การเดินทางเริ่มต้นด้วยการเขียนและจัดการโค้ด CSS ของคุณ ขั้นตอนนี้เป็นรากฐานสำหรับกระบวนการ Deploy ที่ราบรื่น
- การใช้ CSS Preprocessor: ใช้ประโยชน์จาก Preprocessor เช่น Sass, Less หรือ Stylus เพื่อเพิ่มประสิทธิภาพ CSS ของคุณด้วยตัวแปร, mixins, ฟังก์ชัน, และการซ้อน (nesting) สิ่งนี้ส่งเสริมความเป็นโมดูลาร์และความสามารถในการบำรุงรักษา ตัวอย่างเช่น แบรนด์ระดับโลกอาจใช้ตัวแปร Sass เพื่อจัดการสีของแบรนด์ที่แตกต่างกันเล็กน้อยในบางภูมิภาค เพื่อให้แน่ใจว่าเป็นไปตามข้อกำหนดในท้องถิ่นขณะที่ยังคงรักษาสไตล์หลัก
- การนำ Methodology CSS มาใช้: นำ Methodology เช่น BEM (Block, Element, Modifier), SMACSS (Scalable and Modular Architecture for CSS), หรือ ITCSS (Inverted Triangle CSS) มาใช้ Methodology เหล่านี้ส่งเสริมสถาปัตยกรรม CSS ที่เป็นระเบียบ, สามารถปรับขนาดได้, และบำรุงรักษาได้ ซึ่งเป็นสิ่งสำคัญสำหรับโครงการขนาดใหญ่และโครงการระหว่างประเทศ
- ระบบควบคุมเวอร์ชัน (VCS): ใช้ Git สำหรับการควบคุมเวอร์ชัน การเปลี่ยนแปลง CSS แต่ละครั้งควรถูก Commit ด้วยข้อความที่ชัดเจนและมีรายละเอียด กลยุทธ์การ Branching (เช่น Gitflow) เป็นสิ่งจำเป็นสำหรับการจัดการการพัฒนาฟีเจอร์, การแก้ไขข้อผิดพลาด, และการ Release แยกกัน โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมการทำงานร่วมกัน
2. การ Build และ Bundling
ขั้นตอนนี้แปลง CSS ดิบของคุณ (และผลลัพธ์ของ Preprocessor) ให้เป็น Asset ที่ปรับปรุงแล้วพร้อมสำหรับเบราว์เซอร์
- การ Compile Preprocessor: ใช้เครื่องมือ Build เช่น Webpack, Parcel, Vite หรือ Gulp เพื่อ Compile ไฟล์ Sass, Less หรือ Stylus ของคุณให้เป็น CSS มาตรฐาน
- การ Minification: ลบอักขระที่ไม่จำเป็น (ช่องว่าง, ความคิดเห็น) ออกจากไฟล์ CSS ของคุณเพื่อลดขนาด เครื่องมือเช่น `cssnano` หรือ Minifier ที่มาพร้อมกับ Bundler มีประสิทธิภาพสูง พิจารณาผลกระทบต่อ Caching และวิธีที่ Minification อาจส่งผลต่อการ Debug ในสภาพแวดล้อมที่แตกต่างกัน
- Autoprefixing: เพิ่ม Vendor Prefixes (เช่น `-webkit-`, `-moz-`, `-ms-`) ไปยังคุณสมบัติ CSS โดยอัตโนมัติเพื่อให้แน่ใจว่าเข้ากันได้กับทุกเบราว์เซอร์ PostCSS พร้อม `autoprefixer` เป็นมาตรฐานอุตสาหกรรม สิ่งนี้สำคัญอย่างยิ่งสำหรับผู้ชมทั่วโลกที่ใช้เบราว์เซอร์และระบบปฏิบัติการที่หลากหลาย
- Bundling/Concatenation: รวมไฟล์ CSS หลายไฟล์เป็นไฟล์เดียวเพื่อลดจำนวนคำขอ HTTP ที่เบราว์เซอร์ต้องทำ Bundler สมัยใหม่จัดการสิ่งนี้โดยอัตโนมัติ
- Code Splitting: สำหรับโครงการขนาดใหญ่ พิจารณาการแบ่ง CSS ของคุณออกเป็นส่วนเล็กๆ ที่สามารถโหลดได้ตามต้องการ ซึ่งสามารถปรับปรุงประสิทธิภาพการโหลดหน้าเว็บเบื้องต้น
3. การทดสอบ
ก่อนที่จะ Deploy ไปยัง Production การทดสอบอย่างเข้มงวดเป็นสิ่งจำเป็นเพื่อจับการถดถอย (regressions) หรือพฤติกรรมที่ไม่คาดคิด
- Linting: ใช้ CSS Linters เช่น Stylelint เพื่อบังคับใช้มาตรฐานการเขียนโค้ด, ระบุข้อผิดพลาด, และรักษาคุณภาพของโค้ด สิ่งนี้ช่วยป้องกันข้อผิดพลาดทางไวยากรณ์ที่อาจทำให้สไตล์ของคุณหยุดทำงานทั่วโลก
- Visual Regression Testing: ใช้เครื่องมือเช่น Percy, Chromatic หรือ BackstopJS เพื่อเปรียบเทียบภาพหน้าจอของเว็บไซต์ของคุณกับ Baseline สิ่งนี้สำคัญอย่างยิ่งในการจับการเปลี่ยนแปลงทางภาพที่ไม่ตั้งใจ โดยเฉพาะอย่างยิ่งเมื่อสมาชิกในทีมที่แตกต่างกันอาจมีสภาพแวดล้อมการพัฒนาที่แตกต่างกันเล็กน้อย
- Cross-Browser Testing: ทดสอบ CSS ของคุณในเบราว์เซอร์และเวอร์ชันต่างๆ (Chrome, Firefox, Safari, Edge) และบนระบบปฏิบัติการ (Windows, macOS, Linux) และอุปกรณ์มือถือต่างๆ บริการเช่น BrowserStack หรือ Sauce Labs ให้การเข้าถึงสภาพแวดล้อมการทดสอบที่หลากหลาย สำหรับผู้ชมทั่วโลก การทดสอบบนเบราว์เซอร์ที่ไม่ค่อยพบบ่อยแต่สำคัญในภูมิภาคอาจได้รับการพิจารณาด้วย
- Accessibility Testing: ตรวจสอบให้แน่ใจว่าสไตล์ของคุณเป็นไปตามมาตรฐานการเข้าถึง (WCAG) สิ่งนี้เกี่ยวข้องกับการตรวจสอบ Contrast ของสี, Focus indicators, และโครงสร้างเชิงความหมาย การออกแบบที่เข้าถึงได้เป็นประโยชน์ต่อผู้ใช้ทุกคน รวมถึงผู้ที่มีความพิการ
4. การ Deploy ไปยัง Staging Environment
การ Deploy ไปยัง Staging Environment จะจำลองการตั้งค่า Production และอนุญาตให้มีการตรวจสอบขั้นสุดท้ายก่อนที่จะไปใช้งานจริง
- การ Clone Production Environment: เซิร์ฟเวอร์ Staging ควรเป็นสำเนาที่ใกล้เคียงกับเซิร์ฟเวอร์ Production ของคุณในแง่ของเวอร์ชันซอฟต์แวร์, การกำหนดค่า, และโครงสร้างฐานข้อมูล
- การ Deploy Bundled Assets: Deploy ไฟล์ CSS ที่ Compile แล้ว, Minified, และ Autoprefixed ไปยัง Staging Server
- User Acceptance Testing (UAT): ผู้มีส่วนได้ส่วนเสียหลัก, ผู้ทดสอบ QA, หรือแม้แต่กลุ่มเล็กๆ ของผู้ใช้ Beta สามารถทดสอบแอปพลิเคชันใน Staging Environment เพื่อยืนยันว่า CSS แสดงผลอย่างถูกต้องและฟีเจอร์ทั้งหมดทำงานตามที่คาดไว้
5. การ Deploy ไปยัง Production
นี่คือขั้นตอนสุดท้ายที่ CSS ที่ผ่านการทดสอบของคุณจะพร้อมใช้งานสำหรับผู้ใช้ปลายทางของคุณ
- Automated Deployments (CI/CD): รวมกระบวนการ Deploy ของคุณเข้ากับ CI/CD Pipeline โดยใช้เครื่องมือเช่น Jenkins, GitLab CI, GitHub Actions, CircleCI, หรือ Azure DevOps เมื่อมีการเปลี่ยนแปลงถูก Merge เข้าสู่ Branch หลัก (เช่น `main` หรือ `master`) CI/CD Pipeline จะเริ่มขั้นตอน Build, Test, และ Deploy โดยอัตโนมัติ
- Deployment Strategies: พิจารณากลยุทธ์การ Deploy ที่แตกต่างกัน:
- Blue-Green Deployment: รักษา Production Environment ที่เหมือนกันสองชุด การรับส่งข้อมูลจะถูกสลับจากสภาพแวดล้อมเก่า (สีน้ำเงิน) ไปยังสภาพแวดล้อมใหม่ (สีเขียว) หลังจากที่ได้รับการทดสอบอย่างสมบูรณ์แล้ว สิ่งนี้ช่วยให้สามารถ Rollback ได้ทันทีหากเกิดปัญหาขึ้น
- Canary Releases: นำการเปลี่ยนแปลงไปใช้กับผู้ใช้กลุ่มเล็กๆ ก่อน หากไม่พบปัญหาใดๆ การ Rollout จะค่อยๆ เพิ่มขึ้นสำหรับผู้ใช้ทั้งหมด วิธีนี้ช่วยลดผลกระทบของข้อผิดพลาดที่อาจเกิดขึ้น
- Rolling Updates: อัปเดต Instance ทีละรายการหรือเป็นชุดเล็กๆ เพื่อให้แน่ใจว่าแอปพลิเคชันยังคงพร้อมใช้งานตลอดกระบวนการ
- Cache Busting: ใช้เทคนิค Cache Busting เพื่อให้แน่ใจว่าผู้ใช้จะได้รับ CSS เวอร์ชันล่าสุดเสมอ สิ่งนี้มักจะทำโดยการต่อท้ายหมายเลขเวอร์ชันหรือ Hash เข้ากับชื่อไฟล์ (เช่น `styles.1a2b3c4d.css`) เมื่อกระบวนการ Build ของคุณสร้างไฟล์ CSS ใหม่ มันจะอัปเดตการอ้างอิงใน HTML ของคุณให้สอดคล้องกัน
- CDN Integration: ให้บริการไฟล์ CSS ของคุณจาก Content Delivery Network (CDN) CDN จะ Cache Asset ของคุณบนเซิร์ฟเวอร์ที่ตั้งทางภูมิศาสตร์ใกล้กับผู้ใช้ของคุณมากขึ้น ซึ่งช่วยลด Latency และปรับปรุงเวลาในการโหลดสำหรับผู้ชมทั่วโลกได้อย่างมาก
6. การตรวจสอบและการ Rollback
การ Deploy จะไม่สิ้นสุดเมื่อโค้ดออนไลน์แล้ว การตรวจสอบอย่างต่อเนื่องเป็นสิ่งสำคัญ
- Performance Monitoring: ใช้เครื่องมือเช่น Google Analytics, Datadog, หรือ New Relic เพื่อตรวจสอบประสิทธิภาพของเว็บไซต์ รวมถึงเวลาในการโหลด CSS และการแสดงผล
- Error Tracking: ใช้เครื่องมือติดตามข้อผิดพลาด (เช่น Sentry, Bugsnag) เพื่อจับข้อผิดพลาด JavaScript ที่อาจเกี่ยวข้องกับการแสดงผล CSS หรือการจัดการ DOM
- Rollback Plan: ควรมีแผนที่ชัดเจนและผ่านการทดสอบเสมอสำหรับการ Rollback ไปยังเวอร์ชันเสถียรเดิมในกรณีที่เกิดปัญหาสำคัญหลังการ Deploy สิ่งนี้ควรเป็นกระบวนการที่ไม่ซับซ้อนภายใน CI/CD Pipeline ของคุณ
เครื่องมือและเทคโนโลยีสำหรับการ Deploy CSS
การเลือกเครื่องมือสามารถส่งผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพและประสิทธิผลของกระบวนการ Deploy CSS ของคุณ นี่คือหมวดหมู่และตัวอย่างทั่วไป:
- Build Tools/Bundlers:
- Webpack: Bundler โมดูลที่มีประสิทธิภาพและสามารถกำหนดค่าได้สูง
- Vite: เครื่องมือ Front-end ยุคถัดไปที่ปรับปรุงประสบการณ์การพัฒนา Front-end อย่างมาก
- Parcel: Bundler แอปพลิเคชันเว็บแบบ Zero-configuration
- Gulp: ระบบ Build แบบ Stream-based
- CSS Preprocessors:
- Sass (SCSS): ได้รับการยอมรับอย่างกว้างขวางเนื่องจากฟีเจอร์ที่ทรงพลัง
- Less: CSS Preprocessor ยอดนิยมอีกตัว
- Post-processors:
- PostCSS: เครื่องมือสำหรับแปลง CSS ด้วยปลั๊กอิน JavaScript (เช่น `autoprefixer`, `cssnano`)
- Linters:
- Stylelint: CSS Linter ที่ทรงพลังและขยายได้
- Testing Tools:
- Jest: Framework การทดสอบ JavaScript ที่สามารถใช้สำหรับการทดสอบ CSS-in-JS
- Percy / Chromatic / BackstopJS: สำหรับ Visual Regression Testing
- BrowserStack / Sauce Labs: สำหรับ Cross-browser และ Cross-device Testing
- CI/CD Platforms:
- GitHub Actions
- GitLab CI
- Jenkins
- CircleCI
- Azure DevOps
- Content Delivery Networks (CDNs):
- Cloudflare
- AWS CloudFront
- Akamai
ข้อควรพิจารณาสำหรับผู้ชมทั่วโลกในการ Deploy CSS
เมื่อ Deploy CSS สำหรับผู้ชมทั่วโลก มีปัจจัยหลายอย่างที่ต้องให้ความสนใจเป็นพิเศษ:
- Internationalization (i18n) และ Localization (l10n): แม้ว่า CSS โดยตัวมันเองจะไม่แปลข้อความโดยตรง แต่ก็มีบทบาทสำคัญในการปรับ UI ให้เข้ากับภาษาและภูมิภาคต่างๆ ซึ่งรวมถึงการจัดการทิศทางของข้อความ (LTR vs. RTL), รูปแบบฟอนต์, และการปรับเลย์เอาต์
- RTL Support: ใช้ Logical Properties (เช่น `margin-inline-start` แทน `margin-left`) เมื่อเป็นไปได้ และใช้ประโยชน์จาก CSS Logical Properties เพื่อสร้างเลย์เอาต์ที่ปรับให้เข้ากับภาษาจากขวาไปซ้าย เช่น ภาษาอาหรับหรือฮีบรูได้อย่างราบรื่น
- Font Stacks: กำหนด Font Stacks ที่รวมถึง System Fonts และ Web Fonts ที่เหมาะสมกับภาษาและชุดอักขระที่หลากหลาย ตรวจสอบให้แน่ใจว่ามีกลไก Fallback ที่เหมาะสม
- Language-Specific Styles: การโหลด CSS แบบมีเงื่อนไขตามภาษาของผู้ใช้สามารถเพิ่มประสิทธิภาพได้
- ประสิทธิภาพในสภาพเครือข่ายที่หลากหลาย: ผู้ใช้ในส่วนต่างๆ ของโลกอาจประสบกับความเร็วอินเทอร์เน็ตที่แตกต่างกันอย่างมาก ดังนั้น การปรับปรุง CSS เพื่อประสิทธิภาพจึงมีความสำคัญอย่างยิ่ง
- Critical CSS: ดึง CSS ที่จำเป็นในการแสดงเนื้อหา 'above-the-fold' ของหน้าของคุณ และ Inline ไว้ใน HTML โหลด CSS ส่วนที่เหลือแบบ Asynchronously
- HTTP/2 และ HTTP/3: ใช้โปรโตคอล HTTP สมัยใหม่เพื่อการ Multiplexing และ Header Compression ที่ดีขึ้น ซึ่งสามารถปรับปรุงเวลาในการโหลด Asset ได้อย่างมาก
- Gzip/Brotli Compression: ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ของคุณได้รับการกำหนดค่าเพื่อบีบอัดไฟล์ CSS โดยใช้ Gzip หรือ Brotli เพื่อการถ่ายโอนที่เร็วขึ้น
- ความละเอียดอ่อนทางวัฒนธรรมในการออกแบบ: แม้ว่าจะเป็นข้อกังวลด้านการออกแบบเป็นหลัก แต่ CSS ก็ใช้การตัดสินใจเหล่านี้ ควรคำนึงถึงความหมายของสี, ไอคอน, และการจัดวางรูปแบบที่อาจแตกต่างกันไปในแต่ละวัฒนธรรม ตัวอย่างเช่น สีบางสีอาจมีความหมายเชิงสัญลักษณ์ที่แตกต่างกันในวัฒนธรรมต่างๆ
- การจัดการเขตเวลา: เมื่อประสานงานการ Deploy กับทีมที่กระจายตัว ควรสื่อสารหน้าต่างการ Deploy, ขั้นตอนการ Rollback, และผู้ที่อยู่ในสายอย่างชัดเจน โดยคำนึงถึงเขตเวลาที่แตกต่างกัน
แนวปฏิบัติที่ดีที่สุดสำหรับ Workflow ที่คล่องตัว
เพื่อให้แน่ใจว่ากระบวนการ Deploy CSS ของคุณราบรื่นและมีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้ ให้พิจารณาแนวปฏิบัติที่ดีที่สุดเหล่านี้:
- ทำให้ทุกอย่างเป็นอัตโนมัติเท่าที่ทำได้: ตั้งแต่การ Compile, Linting, ไปจนถึงการทดสอบและการ Deploy, ระบบอัตโนมัติช่วยลดข้อผิดพลาดจากมนุษย์และประหยัดเวลา
- กำหนด Convention การตั้งชื่อที่ชัดเจน: การตั้งชื่อไฟล์, คลาส, และตัวแปรที่สอดคล้องกันทำให้โค้ดเข้าใจง่ายและจัดการได้ โดยเฉพาะในทีมขนาดใหญ่และทีมระหว่างประเทศ
- บันทึกกระบวนการของคุณ: จัดทำเอกสารที่ชัดเจนสำหรับ Workflow การ Deploy ของคุณ รวมถึงคำแนะนำในการตั้งค่า, ขั้นตอนการแก้ไขปัญหา, และขั้นตอนการ Rollback
- ตรวจสอบและ Refactor อย่างสม่ำเสมอ: ตรวจสอบฐานโค้ด CSS และกระบวนการ Deploy ของคุณเป็นระยะๆ Refactor สไตล์ที่ไม่มีประสิทธิภาพ และอัปเดตเครื่องมือของคุณให้ทันสมัยอยู่เสมอ
- ใช้ Feature Flags: สำหรับการเปลี่ยนแปลง CSS ที่สำคัญ ให้พิจารณาใช้ Feature Flags เพื่อเปิดหรือปิดใช้งานสำหรับการแบ่งส่วนผู้ใช้เฉพาะ หรือระหว่างการ Rollout แบบค่อยเป็นค่อยไป
- Security First: ตรวจสอบให้แน่ใจว่า CI/CD Pipeline ของคุณปลอดภัย เพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาตหรือการฉีดโค้ดที่เป็นอันตราย ใช้เครื่องมือจัดการ Secrets อย่างเหมาะสม
สรุป
การนำกระบวนการ Deploy CSS ที่แข็งแกร่งมาใช้ไม่ใช่แค่การนำสไตล์จาก Development ไปยัง Production เท่านั้น แต่เป็นการสร้างความมั่นใจในคุณภาพ, ความสม่ำเสมอ, และประสิทธิภาพสำหรับผู้ชมทั่วโลก ด้วยการนำระบบอัตโนมัติ, การทดสอบที่เข้มงวด, การควบคุมเวอร์ชัน, และการพิจารณาความแตกต่างระหว่างประเทศอย่างรอบคอบ คุณสามารถสร้าง Workflow การ Deploy ที่ช่วยเสริมศักยภาพทีมพัฒนาของคุณและมอบประสบการณ์ผู้ใช้ที่ยอดเยี่ยมทั่วโลกไปป์ไลน์ CSS ที่ทำงานได้ดีคือเครื่องพิสูจน์ถึงแนวทางการพัฒนา Front-end ที่เป็นผู้ใหญ่และมีประสิทธิภาพ ซึ่งมีส่วนสำคัญต่อความสำเร็จของโครงการเว็บใดๆ ในระดับโลก